package com.cs.beneficios.web.action;
import com.cs.beneficios.business.entity.ReporteTotalGrupoFamiliarDAO;
import com.cs.beneficios.business.model.ReporteGrupoFamiliarVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.common.ConnectionFactory;
import com.cs.paoyer.administration.business.model.UserVO;

import java.io.IOException;

import java.sql.SQLException;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class TotalReportGenerationRGFAction extends Action 
{
  /**
   * This is the main action called from the Struts framework.
   * @param mapping The ActionMapping used to select this instance.
   * @param form The optional ActionForm bean for this request.
   * @param request The HTTP Request we are processing.
   * @param response The HTTP Response we are processing.
   * @return 
   * @throws java.io.IOException
   * @throws javax.servlet.ServletException
   */
  public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
  {
    HttpSession session = request.getSession();
    //ConnectionFactory cf = new ConnectionFactory("beneficios","beneficios");
	ConnectionFactory cf = new ConnectionFactory();
    UserVO user = (UserVO)session.getAttribute("userInfo");
    
    Collection coReporte = null;
    Collection coReporteNoBene = null;
    Collection coProgSubprog = null;
    List lListFilters = new LinkedList();
    lListFilters = (List)session.getAttribute("ListFiltrado");
    
    String strCodeZona = (String)session.getAttribute("CodeZona");
    String strCodeComuna = (String)session.getAttribute("CodeComuna");
    String strCodeBarrio = (String)session.getAttribute("CodeBarrio");
    String strCodePrograma = (String)session.getAttribute("CodePrograma");
    String strCodeSubPrograma = (String)session.getAttribute("CodeSubPrograma");
    String strInitialDate = "";
    String strFinalDate = "";
    String strCodesProgramas = null;
    String strCodesSubprogramas = null;
    String strProgramaAnterior = "";
    String strCodeProg = "";
    ReporteTotalGrupoFamiliarDAO objReportGrupo = null;
    ReporteGrupoFamiliarVO objReportGrupoVO = null;
    
    // fecha inicial
    Object obDayIni = (Object)session.getAttribute("DayIni");
    String strDayIni = (String)obDayIni;
    Object obMonthIni = (Object)session.getAttribute("MonthIni");
    String strMonthIni = (String)obMonthIni;
    Object obYearIni = (Object)session.getAttribute("YearIni");
    String strYearIni = (String)obYearIni;
    // fecha final
    Object obDayFin = (Object)session.getAttribute("DayFin");
    String strDayFin = (String)obDayFin;
    Object obMonthFin = (Object)session.getAttribute("MonthFin");
    String strMonthFin = (String)obMonthFin;
    Object obYearFin = (Object)session.getAttribute("YearFin");
    String strYearFin = (String)obYearFin; 
    
    if(obDayIni!=null && obMonthIni!=null && obYearIni!=null)
      strInitialDate = strDayIni+"/"+strMonthIni+"/"+strYearIni;
    
    if(obDayFin!=null && obMonthFin!=null && obYearFin!=null)
        strFinalDate = strDayFin+"/"+strMonthFin+"/"+strYearFin;
      
    try
    {
      // Proceso para obtener los criterios de busqueda
      objReportGrupoVO = new ReporteGrupoFamiliarVO();
      if(strCodeZona != null)
        objReportGrupoVO.setCodeZona(new Long(strCodeZona));
      if(strCodeComuna != null)
        objReportGrupoVO.setCodeComuna(new Long(strCodeComuna));
      if(strCodeBarrio != null)
        objReportGrupoVO.setCodeBarrio(new Long(strCodeBarrio));
      if(strInitialDate != "")
        objReportGrupoVO.setDesde(strInitialDate);
      if(strFinalDate != "")
        objReportGrupoVO.setHasta(strFinalDate);
      
      if(strCodePrograma == null || strCodeSubPrograma == null)
      {
        // Proceso para traer los programas y beneficios de acurdo al usuario
        ReporteTotalGrupoFamiliarDAO objRepBeneOtorDAO = new ReporteTotalGrupoFamiliarDAO(cf);
        coProgSubprog = objRepBeneOtorDAO.findProgSubprog(user.getCode(),user.getUserGroupName(),user.getCodeArea());
        cf.closeConnection(objRepBeneOtorDAO.getConn());
        // Fin del proceso
        
        String strCodeMaxProg = null;
        if(coProgSubprog != null && coProgSubprog.size() != 0)
        {
          List listProgSubprog = (List)coProgSubprog;
          SubProgramaVO objSubProgVO = (SubProgramaVO)listProgSubprog.get((coProgSubprog.size()-1));
          strCodeMaxProg = objSubProgVO.getCodePrograma()+"";
        }
        
        if(coProgSubprog != null && coProgSubprog.size() != 0)
        {
          List lProgSubprog = (List)coProgSubprog;
          SubProgramaVO subpro = new SubProgramaVO();
          for(int i=0;i<lProgSubprog.size();i++)
          {
            subpro = (SubProgramaVO)lProgSubprog.get(i);
            if(strCodesProgramas != null)
            {
              if(i != (lProgSubprog.size())-1)
              {
                strCodeProg = subpro.getCodePrograma()+"";
                if(!strProgramaAnterior.equals(strCodeProg))
                {
                  String strCodeProgAct = subpro.getCodePrograma()+"";
                  if(!strCodeProgAct.equals(strCodeMaxProg))
                  {
                    strCodesProgramas += subpro.getCodePrograma()+",";
                    strProgramaAnterior = subpro.getCodePrograma()+"";
                  }else
                  {
                    strCodesProgramas += subpro.getCodePrograma()+"";
                    strProgramaAnterior = subpro.getCodePrograma()+"";
                  }
                }
                strCodesSubprogramas += subpro.getCodeSubPrograma()+",";
              }else
              {
                strCodeProg = subpro.getCodePrograma()+"";
                if(!strProgramaAnterior.equals(strCodeProg))
                {
                  strCodesProgramas += subpro.getCodePrograma()+"";
                  strProgramaAnterior = subpro.getCodePrograma()+"";
                }
                strCodesSubprogramas += subpro.getCodeSubPrograma();
              }
            }else
            {
              if(i != (lProgSubprog.size())-1)
              {
                strCodeProg = subpro.getCodePrograma()+"";
                if(!strProgramaAnterior.equals(strCodeProg))
                {
                  strCodesProgramas = subpro.getCodePrograma()+",";
                  strProgramaAnterior = subpro.getCodePrograma()+"";
                } 
                strCodesSubprogramas = subpro.getCodeSubPrograma()+",";
              }else
              {
                strCodeProg = subpro.getCodePrograma()+"";
                if(!strProgramaAnterior.equals(strCodeProg))
                {
                  strCodesProgramas = subpro.getCodePrograma()+"";
                  strProgramaAnterior = subpro.getCodePrograma()+"";
                }
                strCodesSubprogramas = subpro.getCodeSubPrograma();
              }
            }
          }
        }
      }
      if(strCodePrograma == null)  
        objReportGrupoVO.setCodesProgramas(strCodesProgramas);
      else
        objReportGrupoVO.setCodePrograma(new Long(strCodePrograma));
      
      if(strCodePrograma == null && strCodeSubPrograma == null)
        objReportGrupoVO.setCodesSubprogramas(strCodesSubprogramas);
      else
      {
        if (strCodeSubPrograma != null)
          objReportGrupoVO.setCodeSubprograma(new Long(strCodeSubPrograma));
        else
          objReportGrupoVO.setCodesSubprogramas(strCodesSubprogramas);
      }
        
      // Fin del proceso
      
      // Proceso para obtener la informaci�n del reporte
      objReportGrupo = new ReporteTotalGrupoFamiliarDAO(cf);
      objReportGrupoVO = objReportGrupo.getFilters(objReportGrupoVO);
      coReporte = objReportGrupo.getTotalReportGrupoFamiliar(objReportGrupoVO,lListFilters);
      cf.closeConnection(objReportGrupo.getConn());
      // Fin del proceso
      
    }catch(SQLException e)
    {
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSSPE - cwsub ********/");
    }
    
    
    if(coReporte != null && coReporte.size() != 0)
    {
      session.setAttribute("ListReportGrupoFam",coReporte);
      session.setAttribute("Filters",objReportGrupoVO);
    }else
      request.setAttribute("msgerror", "No hay registros que cumplan con las condiciones seleccionadas");
      
    return mapping.findForward("success");
  }
}